package com.smart.community.commons.enums;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

import lombok.Getter;

/**
 * 业务状态枚举
 * 用于业务模块的特定状态，如支付状态、维修状态等
 * 
 * @author Wu.Liang
 * @since 2025-07-05
 * @version 1.0.0
 */
@Getter
public enum BusinessStatusEnum {
    
    // ==================== 支付状态 ====================
    /**
     * 待支付
     */
    PAYMENT_PENDING(0, "待支付"),
    
    /**
     * 已支付
     */
    PAYMENT_PAID(1, "已支付"),
    
    /**
     * 支付成功
     */
    PAYMENT_SUCCESS(2, "支付成功"),
    
    /**
     * 支付失败
     */
    PAYMENT_FAILED(3, "支付失败"),
    
    /**
     * 已取消
     */
    PAYMENT_CANCELLED(4, "已取消"),
    
    /**
     * 已退款
     */
    PAYMENT_REFUNDED(5, "已退款"),
    
    /**
     * 部分退款
     */
    PAYMENT_PARTIAL_REFUNDED(6, "部分退款"),
    
    // ==================== 别名常量（向后兼容） ====================
    /**
     * 待支付（别名）
     */
    PENDING(0, "待支付"),
    
    /**
     * 已支付（别名）
     */
    PAID(1, "已支付"),
    
    // ==================== 维修状态 ====================
    /**
     * 待处理
     */
    REPAIR_PENDING(1, "待处理"),
    
    /**
     * 已接受
     */
    REPAIR_ACCEPTED(2, "已接受"),
    
    /**
     * 处理中
     */
    REPAIR_PROCESSING(3, "处理中"),
    
    /**
     * 已完成
     */
    REPAIR_COMPLETED(4, "已完成"),
    
    /**
     * 已取消
     */
    REPAIR_CANCELLED(5, "已取消"),
    
    // ==================== 投诉状态 ====================
    /**
     * 待处理
     */
    COMPLAINT_PENDING(1, "待处理"),
    
    /**
     * 处理中
     */
    COMPLAINT_PROCESSING(2, "处理中"),
    
    /**
     * 已完成
     */
    COMPLAINT_COMPLETED(3, "已完成"),
    
    /**
     * 已关闭
     */
    COMPLAINT_CLOSED(4, "已关闭"),
    
    // ==================== 预约状态 ====================
    /**
     * 待确认
     */
    APPOINTMENT_PENDING(1, "待确认"),
    
    /**
     * 已确认
     */
    APPOINTMENT_CONFIRMED(2, "已确认"),
    
    /**
     * 已完成
     */
    APPOINTMENT_COMPLETED(3, "已完成"),
    
    /**
     * 已取消
     */
    APPOINTMENT_CANCELLED(4, "已取消"),
    
    // ==================== 设备状态 ====================
    /**
     * 正常
     */
    DEVICE_NORMAL(1, "正常"),
    
    /**
     * 故障
     */
    DEVICE_FAULT(2, "故障"),
    
    /**
     * 维护中
     */
    DEVICE_MAINTENANCE(3, "维护中"),
    
    /**
     * 离线
     */
    DEVICE_OFFLINE(2, "离线"),
    
    /**
     * 在线
     */
    DEVICE_ONLINE(1, "在线"),
    
    // ==================== 停车位状态 ====================
    /**
     * 空闲
     */
    PARKING_SPACE_FREE(1, "空闲"),
    
    /**
     * 占用
     */
    PARKING_SPACE_OCCUPIED(2, "占用"),
    
    /**
     * 维护中
     */
    PARKING_SPACE_MAINTENANCE(3, "维护中"),
    
    // ==================== 通知状态 ====================
    /**
     * 未读
     */
    NOTIFICATION_UNREAD(1, "未读"),
    
    /**
     * 已读
     */
    NOTIFICATION_READ(2, "已读"),
    
    /**
     * 已删除
     */
    NOTIFICATION_DELETED(3, "已删除"),
    
    // ==================== 紧急事件状态 ====================
    /**
     * 待处理
     */
    EMERGENCY_PENDING(1, "待处理"),
    
    /**
     * 处理中
     */
    EMERGENCY_PROCESSING(2, "处理中"),
    
    /**
     * 已完成
     */
    EMERGENCY_COMPLETED(3, "已完成"),
    
    /**
     * 已关闭
     */
    EMERGENCY_CLOSED(4, "已关闭");
    
    @JsonValue
    private final Integer code;
    private final String description;
    
    /**
     * 构造函数
     * 
     * @param code 状态代码
     * @param description 状态描述
     */
    BusinessStatusEnum(Integer code, String description) {
        this.code = code;
        this.description = description;
    }
    
    /**
     * 根据代码获取枚举
     * 
     * @param code 状态代码
     * @return 状态枚举
     */
    public static BusinessStatusEnum getByCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (BusinessStatusEnum status : values()) {
            if (status.getCode().equals(code)) {
                return status;
            }
        }
        return null;
    }
    
    /**
     * 获取状态描述
     * 
     * @param code 状态代码
     * @return 状态描述
     */
    public static String getDescriptionByCode(Integer code) {
        BusinessStatusEnum status = getByCode(code);
        return status != null ? status.getDescription() : "未知状态";
    }
    
    // ==================== 支付状态判断方法 ====================
    /**
     * 检查是否为未支付状态
     * 
     * @param code 状态代码
     * @return 是否为未支付状态
     */
    public static boolean isUnpaid(Integer code) {
        return PAYMENT_PENDING.getCode().equals(code);
    }
    
    /**
     * 检查是否为已支付状态
     * 
     * @param code 状态代码
     * @return 是否为已支付状态
     */
    public static boolean isPaid(Integer code) {
        return PAYMENT_PAID.getCode().equals(code) || PAYMENT_SUCCESS.getCode().equals(code);
    }
    
    /**
     * 检查是否为失败状态
     * 
     * @param code 状态代码
     * @return 是否为失败状态
     */
    public static boolean isFailed(Integer code) {
        return PAYMENT_FAILED.getCode().equals(code) || PAYMENT_CANCELLED.getCode().equals(code);
    }
    
    /**
     * 检查是否为退款状态
     * 
     * @param code 状态代码
     * @return 是否为退款状态
     */
    public static boolean isRefunded(Integer code) {
        return PAYMENT_REFUNDED.getCode().equals(code) || PAYMENT_PARTIAL_REFUNDED.getCode().equals(code);
    }
    
    /**
     * 检查是否可以退款
     * 
     * @param code 状态代码
     * @return 是否可以退款
     */
    public static boolean canRefund(Integer code) {
        return isPaid(code);
    }
    
    // ==================== 维修状态判断方法 ====================
    /**
     * 检查是否为待处理状态
     * 
     * @param code 状态代码
     * @return 是否为待处理状态
     */
    public static boolean isRepairPending(Integer code) {
        return REPAIR_PENDING.getCode().equals(code);
    }
    
    /**
     * 检查是否为处理中状态
     * 
     * @param code 状态代码
     * @return 是否为处理中状态
     */
    public static boolean isRepairProcessing(Integer code) {
        return REPAIR_PROCESSING.getCode().equals(code);
    }
    
    /**
     * 检查是否为已完成状态
     * 
     * @param code 状态代码
     * @return 是否为已完成状态
     */
    public static boolean isRepairCompleted(Integer code) {
        return REPAIR_COMPLETED.getCode().equals(code);
    }
    
    /**
     * 检查是否为已取消状态
     * 
     * @param code 状态代码
     * @return 是否为已取消状态
     */
    public static boolean isRepairCancelled(Integer code) {
        return REPAIR_CANCELLED.getCode().equals(code);
    }
    
    // ==================== 设备状态判断方法 ====================
    /**
     * 检查设备是否正常
     * 
     * @param code 状态代码
     * @return 设备是否正常
     */
    public static boolean isDeviceNormal(Integer code) {
        return DEVICE_NORMAL.getCode().equals(code);
    }
    
    /**
     * 检查设备是否故障
     * 
     * @param code 状态代码
     * @return 设备是否故障
     */
    public static boolean isDeviceFault(Integer code) {
        return DEVICE_FAULT.getCode().equals(code);
    }
    
    /**
     * 检查设备是否在线
     * 
     * @param code 状态代码
     * @return 设备是否在线
     */
    public static boolean isDeviceOnline(Integer code) {
        return DEVICE_ONLINE.getCode().equals(code);
    }
    
    /**
     * 检查设备是否离线
     * 
     * @param code 状态代码
     * @return 设备是否离线
     */
    public static boolean isDeviceOffline(Integer code) {
        return DEVICE_OFFLINE.getCode().equals(code);
    }
    
    /**
     * Jackson反序列化方法
     * 严格遵循《系统状态枚举权威标准声明.md》规范
     * 
     * @param code 枚举值
     * @return 对应的枚举，如果不存在则返回null
     */
    @JsonCreator
    public static BusinessStatusEnum fromCode(Integer code) {
        return getByCode(code);
    }
}
